! git log -1 --format="%H"
28688145c190ebc1427f3830d5580e6337c2ebbf
import sys
# Install gurobi
!{sys.executable} -m pip install -i https://pypi.gurobi.com gurobipy
!{sys.executable} -m pip install plotly geopy
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pandas as pd
from itertools import product
import gurobipy as gp
from gurobipy import GRB, quicksum
# These are ours
import problem
import visualization
Looking in indexes: https://pypi.gurobi.com Requirement already satisfied: gurobipy in /opt/anaconda3/lib/python3.8/site-packages (9.1.1) Requirement already satisfied: plotly in /opt/anaconda3/lib/python3.8/site-packages (4.14.3) Requirement already satisfied: geopy in /opt/anaconda3/lib/python3.8/site-packages (2.1.0) Requirement already satisfied: six in /opt/anaconda3/lib/python3.8/site-packages (from plotly) (1.15.0) Requirement already satisfied: retrying>=1.3.3 in /opt/anaconda3/lib/python3.8/site-packages (from plotly) (1.3.3) Requirement already satisfied: geographiclib<2,>=1.49 in /opt/anaconda3/lib/python3.8/site-packages (from geopy) (1.50)
def normalize(i, j):
assert i != j
return (i, j) if i < j else (j, i)
from model import Autonomax, Config
# Run on the first |C| cities (mostly for testing)
C = 41
# What scenario we will be utilizing
scenario = 2
# The number of cities in the core net
NC = 3
# 1 if the core net should be a cycle; 0 if it shoul be a path.
Z = 1
autonomax = Autonomax(
Config(
cities=problem.cities[:C],
distances=problem.D[:C, :C],
demand=problem.B[scenario][:C],
core_city_count=NC,
core_net_is_cycle=Z,
)
)
Academic license - for non-commercial use only - expires 2021-05-15 Using license file /Users/sjurwold/gurobi.lic
A = autonomax.model.getA()
count = lambda d: len(d) if isinstance(d, gp.tupledict) else 1
V = sum(count(v) for v in autonomax.variables.values())
C = sum(count(c) for c in autonomax.constraints.values())
print(f'V = {V}, C = {C}')
fig, ax = plt.subplots(1, figsize=(128, 128 * C/V))
ax.set_xticklabels([])
ax.set_yticklabels([])
plt.spy(A)
total = 0
print(f'\nCONSTRAINT SETS:')
for (name, constraint) in autonomax.constraints.items():
constraints_in_set = count(constraint)
print(f'{constraints_in_set:>5} | {name}')
#plt.gcf().text(0.07, 0.69 - 0.4 * (total + 0.5 * count(constraint)) / C, name, fontsize=14)
total += constraints_in_set
plt.plot([0, V], [total - 0.5, total - 0.5], color='grey')
total = 0
print(f'\nVARIABLE SETS:')
for (name, variables) in autonomax.variables.items():
variables_in_set = count(variables)
print(f'{variables_in_set:>5} | {name}')
#plt.gcf().text(0.1 + 0.8 * (total + 0.5*count(variables)) / V, 0.8, name, fontsize=14)
total += count(variables)
plt.plot([total - 0.5, total - 0.5], [0, C], color='grey')
plt.savefig('constraint-matrix.png', dpi=200)
V = 9389, C = 6153
CONSTRAINT SETS:
1 | one_control_center
41 | control_city_directly_connected
1681 | reduce_control_center_symmetry
41 | core_city_ub
1 | cycle_or_path
41 | disallow_core_tree
1 | exactly_nc_core_cities
41 | control_center_is_connected
2460 | is_connectable
123 | is_connected_timestep
41 | connected_graph
41 | conservation_of_flow
820 | force_edge_if_flow
820 | edge_cost_lb
VARIABLE SETS:
41 | is_control_center
820 | is_core_edge
41 | is_core_city
164 | is_connected_step
5043 | is_connectable_step
820 | flow
820 | abs_flow
820 | is_sub_edge
820 | edge_cost
autonomax.model.Params.timeLimit = 1200.0
autonomax.model.optimize()
Changed value of parameter timeLimit to 1200.0
Prev: inf Min: 0.0 Max: inf Default: inf
Gurobi Optimizer version 9.1.1 build v9.1.1rc0 (mac64)
Thread count: 8 physical cores, 8 logical processors, using up to 8 threads
Optimize a model with 6153 rows, 9389 columns and 30299 nonzeros
Model fingerprint: 0xc7b830a6
Model has 4 SOS constraints
Model has 820 general constraints
Variable types: 2460 continuous, 6929 integer (6929 binary)
Coefficient statistics:
Matrix range [1e+00, 3e+05]
Objective range [1e+00, 2e+04]
Bounds range [1e+00, 1e+02]
RHS range [7e-01, 4e+01]
Presolve removed 90 rows and 2633 columns
Presolve time: 0.10s
Presolved: 6063 rows, 6756 columns, 30429 nonzeros
Variable types: 2460 continuous, 4296 integer (4296 binary)
Found heuristic solution: objective 101614.81952
Root relaxation: objective 1.488799e+03, 5527 iterations, 0.16 seconds
Nodes | Current Node | Objective Bounds | Work
Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time
0 0 1488.79878 0 153 101614.820 1488.79878 98.5% - 0s
H 0 0 92993.411858 1488.79878 98.4% - 0s
0 0 2055.13765 0 242 92993.4119 2055.13765 97.8% - 0s
H 0 0 28818.896409 2055.13765 92.9% - 0s
0 0 2950.69016 0 253 28818.8964 2950.69016 89.8% - 0s
0 0 2951.48088 0 228 28818.8964 2951.48088 89.8% - 0s
0 0 2951.84716 0 260 28818.8964 2951.84716 89.8% - 0s
0 0 3104.36147 0 319 28818.8964 3104.36147 89.2% - 0s
0 0 3111.90023 0 312 28818.8964 3111.90023 89.2% - 1s
0 0 3112.25235 0 311 28818.8964 3112.25235 89.2% - 1s
0 0 3123.97500 0 287 28818.8964 3123.97500 89.2% - 1s
0 0 3133.75015 0 294 28818.8964 3133.75015 89.1% - 1s
0 0 3134.42243 0 291 28818.8964 3134.42243 89.1% - 1s
0 0 3134.79246 0 285 28818.8964 3134.79246 89.1% - 1s
0 0 3141.65289 0 298 28818.8964 3141.65289 89.1% - 1s
0 0 3145.99541 0 271 28818.8964 3145.99541 89.1% - 1s
0 0 3146.33500 0 272 28818.8964 3146.33500 89.1% - 1s
H 0 0 25414.826158 3146.33500 87.6% - 1s
0 0 3147.72598 0 273 25414.8262 3147.72598 87.6% - 1s
H 0 0 24803.669498 3147.72598 87.3% - 1s
0 0 3148.29332 0 265 24803.6695 3148.29332 87.3% - 1s
H 0 0 23678.405041 3148.29332 86.7% - 1s
0 0 3150.68467 0 303 23678.4050 3150.68467 86.7% - 1s
0 0 3150.68467 0 272 23678.4050 3150.68467 86.7% - 1s
H 0 0 19410.589948 3150.68467 83.8% - 2s
0 2 3150.68900 0 259 19410.5899 3150.68900 83.8% - 2s
H 68 75 19347.398499 3345.60107 82.7% 363 3s
H 68 75 18403.134936 3345.60107 81.8% 363 3s
H 69 75 17507.500375 3345.60107 80.9% 360 3s
H 74 75 17478.472099 3345.60107 80.9% 342 3s
H 309 274 17437.061948 3345.60107 80.8% 163 4s
H 310 274 17416.036632 3345.60107 80.8% 163 4s
382 361 3659.87835 20 228 17416.0366 3345.60107 80.8% 159 5s
H 646 566 17406.036633 3345.60107 80.8% 120 5s
H 666 534 16762.313114 3345.60107 80.0% 117 5s
H 1030 822 16751.178581 3345.60107 80.0% 94.1 6s
* 1116 799 172 15951.365184 3345.60107 79.0% 93.2 6s
* 1117 770 171 15431.365184 3345.60107 78.3% 93.2 6s
H 1235 846 15430.782990 3345.60107 78.3% 91.1 6s
H 1237 838 15418.705150 3345.60107 78.3% 91.8 6s
1495 976 9876.64104 63 272 15418.7052 3345.60107 78.3% 83.9 10s
1516 990 3673.06795 23 393 15418.7052 3371.99330 78.1% 82.7 15s
H 1524 944 15418.705141 3414.88923 77.9% 82.3 16s
1536 952 10087.3880 53 434 15418.7051 3474.27621 77.5% 81.7 20s
1546 962 3557.35957 11 335 15418.7051 3509.89522 77.2% 122 29s
1548 964 3655.49498 12 356 15418.7051 3655.49498 76.3% 124 31s
1567 975 3863.13366 15 335 15418.7051 3825.87921 75.2% 137 35s
H 1664 969 15418.705127 3864.00963 74.9% 163 39s
1696 972 6731.71313 20 216 15418.7051 3864.00963 74.9% 165 40s
H 1715 929 15418.705101 3864.00963 74.9% 167 41s
H 1717 884 15418.705086 3864.00963 74.9% 168 41s
H 1722 840 15418.705027 3864.00963 74.9% 169 41s
H 1803 799 15418.705007 3864.00963 74.9% 180 43s
H 1805 761 15418.704942 3864.00963 74.9% 180 43s
H 1807 739 15418.704912 3864.00963 74.9% 180 44s
H 1812 703 15418.704895 3864.00963 74.9% 181 44s
H 1813 670 15318.705150 3864.00963 74.8% 181 44s
1832 678 5231.99152 26 230 15318.7052 3864.00963 74.8% 182 45s
2022 706 9312.92486 33 166 15318.7052 3864.00963 74.8% 199 50s
2458 779 4797.56257 20 328 15318.7052 4029.75433 73.7% 209 55s
2699 825 11518.5442 28 227 15318.7052 4029.75433 73.7% 216 60s
3179 828 cutoff 21 15318.7052 5180.70055 66.2% 219 65s
H 3188 795 15318.705148 5180.70055 66.2% 220 65s
H 3190 775 15318.705136 5180.70055 66.2% 221 65s
3589 1037 cutoff 42 15318.7051 6590.47848 57.0% 220 70s
4115 1265 8352.81027 17 235 15318.7051 7546.09982 50.7% 219 75s
4576 1431 10770.2011 32 199 15318.7051 7829.80665 48.9% 216 80s
5046 1663 13666.2879 29 168 15318.7051 8196.28175 46.5% 215 85s
5716 1948 12096.3314 45 83 15318.7051 8453.38674 44.8% 215 90s
H 6489 2197 15318.705126 8833.18338 42.3% 213 95s
H 7264 2389 15318.705113 9149.25368 40.3% 211 101s
7724 2705 13358.6597 33 153 15318.7051 9227.54783 39.8% 210 105s
8423 3015 13566.1238 36 161 15318.7051 9416.33800 38.5% 211 112s
8746 3178 13335.1588 44 140 15318.7051 9459.98583 38.2% 211 146s
9382 3451 10708.7657 36 149 15318.7051 9606.96927 37.3% 209 151s
10039 3740 cutoff 26 15318.7051 9743.44588 36.4% 208 159s
10458 3811 13313.5950 33 134 15318.7051 9788.99325 36.1% 207 162s
10731 3989 11988.5665 25 233 15318.7051 9815.96389 35.9% 207 165s
11232 4072 15166.9957 45 87 15318.7051 9935.75144 35.1% 206 201s
11650 4209 cutoff 36 15318.7051 10011.1375 34.6% 206 205s
12677 4494 10858.0746 36 140 15318.7051 10139.0016 33.8% 205 211s
13268 4656 13371.0211 45 81 15318.7051 10233.7282 33.2% 204 215s
14434 4976 14369.9911 27 211 15318.7051 10387.7703 32.2% 202 225s
14892 5227 13086.3329 43 73 15318.7051 10439.9672 31.8% 203 231s
15721 5388 cutoff 38 15318.7051 10557.7352 31.1% 201 236s
16394 5415 13534.5849 48 68 15318.7051 10627.4053 30.6% 200 240s
16580 5628 15074.7981 56 107 15318.7051 10668.7391 30.4% 201 245s
17963 5852 cutoff 46 15318.7051 10786.9283 29.6% 201 253s
18690 5948 12132.2311 38 174 15318.7051 10898.6313 28.9% 201 258s
19138 5972 cutoff 43 15318.7051 10944.2638 28.6% 202 263s
19881 6011 cutoff 49 15318.7051 11018.8667 28.1% 202 268s
20601 6058 12569.1237 38 159 15318.7051 11103.3793 27.5% 202 277s
21002 6143 cutoff 35 15318.7051 11162.2063 27.1% 203 283s
21860 6152 13128.3460 47 102 15318.7051 11252.5368 26.5% 203 289s
22688 6169 14710.1985 53 72 15318.7051 11335.8614 26.0% 203 295s
23594 6184 14172.1980 43 120 15318.7051 11450.5059 25.3% 203 315s
24136 6173 12917.1491 44 91 15318.7051 11466.4718 25.1% 203 386s
25086 6215 13490.5242 35 184 15318.7051 11628.1974 24.1% 203 392s
26009 6152 12040.4899 35 150 15318.7051 11685.8734 23.7% 203 416s
26762 6083 infeasible 39 15318.7051 11803.4022 22.9% 204 422s
27693 6036 12485.6578 42 120 15318.7051 11888.0053 22.4% 203 427s
28287 5983 14112.8093 41 176 15318.7051 11946.5037 22.0% 203 432s
29272 5896 14307.2075 51 58 15318.7051 12023.9874 21.5% 203 438s
30205 5768 cutoff 34 15318.7051 12137.3658 20.8% 203 443s
30981 5576 13169.6357 35 147 15318.7051 12215.5098 20.3% 203 449s
31844 5383 infeasible 40 15318.7051 12335.2274 19.5% 202 454s
32732 5188 13418.5839 40 132 15318.7051 12401.0767 19.0% 202 460s
33594 5082 cutoff 45 15318.7051 12516.4779 18.3% 202 466s
34569 4843 infeasible 22 15318.7051 12608.8860 17.7% 202 472s
35461 4643 cutoff 43 15318.7051 12712.7714 17.0% 201 506s
36397 4378 cutoff 41 15318.7051 12823.9244 16.3% 201 511s
37300 4068 13751.2113 30 226 15318.7051 12937.5775 15.5% 200 599s
38134 3738 14904.6970 39 137 15318.7051 13039.5602 14.9% 200 604s
39030 3493 cutoff 40 15318.7051 13178.0679 14.0% 199 609s
39516 3006 cutoff 49 15318.7051 13244.8704 13.5% 199 613s
40563 2518 infeasible 52 15318.7051 13452.5191 12.2% 198 618s
41565 2008 cutoff 39 15318.7051 13545.0783 11.6% 197 628s
42571 1421 14134.6574 44 102 15318.7051 13747.2665 10.3% 196 633s
43640 794 cutoff 40 15318.7051 13946.6184 8.96% 194 638s
44467 0 cutoff 45 15318.7051 14104.2236 7.93% 193 642s
Cutting planes:
Gomory: 32
Cover: 1453
Implied bound: 5
Clique: 1
MIR: 417
StrongCG: 1
Flow cover: 797
GUB cover: 17
Inf proof: 4
Zero half: 33
RLT: 203
Relax-and-lift: 28
Explored 46324 nodes (8695438 simplex iterations) in 642.68 seconds
Thread count was 8 (of 8 available processors)
Solution count 10: 15318.7 15318.7 15318.7 ... 15430.8
Optimal solution found (tolerance 1.00e-04)
Best objective 1.531870511262e+04, best bound 1.531870511262e+04, gap 0.0000%
city_info = pd.DataFrame(autonomax.city_info())
city_info
| Index | Name | IsCoreCity | IsControlCenter | Demand | IngoingFlow | OutgoingFlow | |
|---|---|---|---|---|---|---|---|
| 0 | 0 | Boden | False | False | 2.3 | 2.800000e+00 | 5.1 |
| 1 | 1 | Borås | False | False | 1.9 | 2.520000e+01 | 27.1 |
| 2 | 2 | Eskilstuna | False | False | 1.3 | 5.800000e+00 | 7.1 |
| 3 | 3 | Falun | False | False | 1.9 | 1.394766e-12 | 1.9 |
| 4 | 4 | Gävle | False | False | 0.7 | 2.610000e+01 | 26.8 |
| 5 | 5 | Göteborg | False | False | 6.4 | 2.486900e-13 | 6.4 |
| 6 | 6 | Halmstad | False | False | 3.4 | 1.160000e+01 | 15.0 |
| 7 | 7 | Haparanda | False | False | 3.9 | 0.000000e+00 | 3.9 |
| 8 | 8 | Helsingborg | False | False | 3.7 | 7.900000e+00 | 11.6 |
| 9 | 9 | Hudiksvall | False | False | 1.3 | 2.230000e+01 | 23.6 |
| 10 | 10 | Jönköping | True | False | 2.9 | 1.144000e+02 | 117.3 |
| 11 | 11 | Kalmar | False | False | 2.8 | 1.058709e-12 | 2.8 |
| 12 | 12 | Karlskrona | False | False | 4.3 | 4.476419e-13 | 4.3 |
| 13 | 13 | Karlstad | False | False | 2.4 | 1.023182e-12 | 2.4 |
| 14 | 14 | Kiruna | False | False | 2.8 | 1.563194e-13 | 2.8 |
| 15 | 15 | Kristianstad | False | False | 4.5 | 3.623768e-13 | 4.5 |
| 16 | 16 | Lidköping | False | False | 0.7 | 8.100000e+00 | 8.8 |
| 17 | 17 | Linköping | True | False | 2.9 | 5.580000e+01 | 58.7 |
| 18 | 18 | Luleå | False | False | 4.4 | 9.000000e+00 | 13.4 |
| 19 | 19 | Malmö | False | False | 4.2 | 3.700000e+00 | 7.9 |
| 20 | 20 | Motala | True | False | 3.1 | 1.219000e+02 | 125.0 |
| 21 | 21 | Norrköping | True | True | 3.4 | 1.740000e+02 | 52.4 |
| 22 | 22 | Nyköping | False | False | 4.4 | 3.750000e+01 | 41.9 |
| 23 | 23 | Sandviken | False | False | 2.5 | 1.556089e-12 | 2.5 |
| 24 | 24 | Skellefteå | False | False | 1.4 | 1.340000e+01 | 14.8 |
| 25 | 25 | Skövde | False | False | 3.1 | 8.800000e+00 | 11.9 |
| 26 | 26 | Stockholm | False | False | 7.7 | 2.980000e+01 | 37.5 |
| 27 | 27 | Sundsvall | False | False | 2.1 | 2.020000e+01 | 22.3 |
| 28 | 28 | Trelleborg | False | False | 3.7 | 1.442402e-12 | 3.7 |
| 29 | 29 | Uddevalla | False | False | 4.0 | 1.257661e-12 | 4.0 |
| 30 | 30 | Umeå | False | False | 1.9 | 1.480000e+01 | 16.7 |
| 31 | 31 | Uppsala | False | False | 3.0 | 2.680000e+01 | 29.8 |
| 32 | 32 | Varberg | False | False | 3.8 | 1.500000e+01 | 18.8 |
| 33 | 33 | Vetlanda | False | False | 0.8 | 1.590000e+01 | 16.7 |
| 34 | 34 | Vänersborg | False | False | 4.1 | 4.000000e+00 | 8.1 |
| 35 | 35 | Västervik | False | False | 3.4 | 3.006484e-12 | 3.4 |
| 36 | 36 | Västerås | False | False | 3.9 | 1.900000e+00 | 5.8 |
| 37 | 37 | Växjö | False | False | 4.3 | 8.800000e+00 | 13.1 |
| 38 | 38 | Örebro | False | False | 2.2 | 2.400000e+00 | 4.6 |
| 39 | 39 | Örnsköldsvik | False | False | 2.5 | 1.670000e+01 | 19.2 |
| 40 | 40 | Östersund | False | False | 1.0 | 1.765699e-12 | 1.0 |
edge_info = pd.DataFrame(autonomax.edge_info())
edge_info
| From | To | Type | Flow | Cost | Distance | |
|---|---|---|---|---|---|---|
| 0 | Skellefteå | Umeå | SUB | 14.8 | 557.326132 | 111 |
| 1 | Eskilstuna | Västerås | SUB | -5.8 | 61.716685 | 43 |
| 2 | Gävle | Hudiksvall | SUB | -23.6 | 966.610215 | 118 |
| 3 | Norrköping | Nyköping | SUB | -41.9 | 595.269663 | 58 |
| 4 | Nyköping | Stockholm | SUB | -37.5 | 1022.500000 | 90 |
| 5 | Linköping | Norrköping | CORE | -52.4 | 440.000000 | 44 |
| 6 | Karlskrona | Växjö | SUB | 4.3 | 150.077607 | 102 |
| 7 | Motala | Örebro | SUB | -4.6 | 138.362916 | 92 |
| 8 | Boden | Kiruna | SUB | -2.8 | 449.539100 | 291 |
| 9 | Sundsvall | Östersund | SUB | -1.0 | 77.633542 | 166 |
| 10 | Halmstad | Helsingborg | SUB | -11.6 | 267.571986 | 79 |
| 11 | Jönköping | Vetlanda | SUB | -16.7 | 286.749284 | 65 |
| 12 | Umeå | Örnsköldsvik | SUB | 16.7 | 627.590973 | 111 |
| 13 | Lidköping | Skövde | SUB | 8.8 | 105.450180 | 49 |
| 14 | Karlstad | Örebro | SUB | 2.4 | 61.279919 | 77 |
| 15 | Halmstad | Varberg | SUB | 15.0 | 258.577201 | 65 |
| 16 | Lidköping | Vänersborg | SUB | -8.1 | 129.045192 | 60 |
| 17 | Uddevalla | Vänersborg | SUB | 4.0 | 22.172747 | 21 |
| 18 | Gävle | Sandviken | SUB | -2.5 | 19.882118 | 25 |
| 19 | Hudiksvall | Sundsvall | SUB | -22.3 | 524.081992 | 81 |
| 20 | Borås | Göteborg | SUB | -6.4 | 131.078630 | 71 |
| 21 | Falun | Västerås | SUB | 1.9 | 97.009877 | 128 |
| 22 | Jönköping | Linköping | CORE | -58.7 | 1250.000000 | 125 |
| 23 | Linköping | Västervik | SUB | -3.4 | 112.715626 | 97 |
| 24 | Sundsvall | Örnsköldsvik | SUB | -19.2 | 878.974055 | 127 |
| 25 | Jönköping | Motala | CORE | 117.3 | 1080.000000 | 108 |
| 26 | Vetlanda | Växjö | SUB | -13.1 | 263.087118 | 72 |
| 27 | Borås | Varberg | SUB | -18.8 | 467.695643 | 84 |
| 28 | Haparanda | Luleå | SUB | 3.9 | 180.293133 | 124 |
| 29 | Luleå | Skellefteå | SUB | 13.4 | 659.953460 | 133 |
| 30 | Stockholm | Uppsala | SUB | -29.8 | 550.119554 | 69 |
| 31 | Motala | Norrköping | CORE | 125.0 | 790.000000 | 79 |
| 32 | Kristianstad | Växjö | SUB | 4.5 | 197.061487 | 120 |
| 33 | Gävle | Uppsala | SUB | 26.8 | 403.877951 | 60 |
| 34 | Helsingborg | Malmö | SUB | -7.9 | 126.105814 | 60 |
| 35 | Borås | Jönköping | SUB | 27.1 | 646.341239 | 82 |
| 36 | Jönköping | Skövde | SUB | -11.9 | 284.330749 | 81 |
| 37 | Boden | Luleå | SUB | 5.1 | 39.194104 | 32 |
| 38 | Malmö | Trelleborg | SUB | -3.7 | 33.196374 | 34 |
| 39 | Eskilstuna | Norrköping | SUB | 7.1 | 241.290923 | 102 |
| 40 | Kalmar | Vetlanda | SUB | 2.8 | 124.941927 | 119 |
core_cost = sum(edge_info[edge_info['Type'] == 'CORE']['Cost'])
subnet_cost = sum(edge_info[edge_info['Type'] == 'SUB']['Cost'])
total_cost = core_cost + subnet_cost
print(f'core = {core_cost:>9.3f}')
print(f'subnet = {subnet_cost:>9.3f}')
print('------------------')
print(f'total = {total_cost:>9.3f}')
assert abs(autonomax.model.getObjective().getValue() - total_cost) < 1e-6
core = 3560.000 subnet = 11758.705 ------------------ total = 15318.705
visualization.show(pd.DataFrame(autonomax.city_info()), pd.DataFrame(autonomax.edge_info()))